package mybatis.intercepter;

import java.util.Properties;

import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;

/**
 * 完成插件签名： 告诉MyBatis当前插件用来拦截哪个对象的哪个方法
 *  type:要拦截的四大类型
 *  method：拦截那个方法
 *   args：这个方法的入参
 */
@Intercepts({ @Signature(
		type = StatementHandler.class, 
		method = "parameterize",
		args = java.sql.Statement.class) })
public class FirstIntercepter implements Interceptor {

	/**
	 * 1：业务逻辑处理的方法：
	 */
	@Override
	public Object intercept(Invocation invocation) throws Throwable {
		//在这里可以进行业务逻辑修改
		System.out.println("FirstIntercepter:===>intercept"+invocation.getMethod());
		
		MetaObject metaObject = SystemMetaObject.forObject(invocation.getTarget());
		//拿到target的元数据 StatementHandler==>ParameterHandler===>
		//DefaultParameterHandler==>>parameterObject
		Object value = metaObject.getValue("parameterHandler.parameterObject");
		System.out.println("sql "+value.toString());
		//修改完sql语句要用的参数
	    metaObject.setValue("parameterHandler.parameterObject", 2);
		Object object = invocation.proceed();
		return object;
	}

	/**
	 * plugin： 包装目标对象的：包装：为目标对象创建一个代理对象
	 */
	@Override
	public Object plugin(Object target) {
		Object wrap = Plugin.wrap(target, this);
		System.out.println("FirstIntercepter====>plugin" + target);
		return wrap;
	}

	/**
	 * 获取在mybatis-cfg.xml中绑定的参数： 包装为一个properties对象
	 */
	@Override
	public void setProperties(Properties properties) {
		System.out.println("FirstIntercepter=====>setProperties");
	}

}
